package algo;
import tree.*;
/**
* Classe appliquant l'etape de definition de reference
* @author Kevin Georgy
* @since 13.06.2007	
* @version 1.0
*/

public class DefineRefStep extends Step {
	
	/**
	* Construit l'etape de definition
	* @param aQuickSort QuickSort que l'etape doit modifier
	*/	
	DefineRefStep(QuickSort aQuickSort) {
		super(aQuickSort);
	}
	
	/**
	* Applique l'etape de definition de la reference
	* @return Etape suivante
	*/	
	Step apply() {
		super.apply();
			
			if (quickSort.state().current.getContent().begin == 
				quickSort.state().current.getContent().end)
			{
				// Partition de 1 élément
				tutoText = "Rien a faire pour cette partition";
				
				// Partition est OK
				quickSort.state().current.getContent().OK = true;
				
				// Recherche de la prochaine partition courante
				Tree<Partition> tmp = quickSort.state().current;
				while (tmp != null && 
				       (tmp.right() == null || tmp.right().getContent().OK))
				{
					tmp.getContent().OK = true;
					tmp = tmp.parent();
				}
				
				if (tmp == null)
					// Pas de nouvelle partition a traiter, fin du tri
					return quickSort.steps().end();
				else
				{
					
					// Definition de la nouvelle partition courante
					quickSort.state().current.getContent().isCurrent = false;
					quickSort.state().current = tmp.right();
					quickSort.state().current.getContent().isCurrent = true;
					return quickSort.steps().define();
				}
				
			}
			// Definition des curseur courant
			quickSort.state().leftCursor = 
				quickSort.state().current.getContent().begin;
			quickSort.state().rightCursor = 
				quickSort.state().current.getContent().end;
			quickSort.state().reference = quickSort.state().array.get(
					(quickSort.state().current.getContent().end-
					quickSort.state().current.getContent().begin)/2+
					quickSort.state().current.getContent().begin);
			
			// Definition du text explicatif
			tutoText = "D\u00E9finition de la nouvelle r\u00E9f\u00E9rence \u00E0 "+
				quickSort.state().reference;
			return quickSort.steps().advance();
		
	}
	
	/**
	* Indique le nom de l'etape
	* @return Nom de l'etape
	*/	
	public String stepName() {
		return "Etape de d\u00E9finition de la r\u00E9ference";
	}
	
}
